package com.testing.aggregate;

import java.util.HashSet;
import java.util.concurrent.TimeUnit;

/**
 * @author lzp
 */
public class TestHashSet {

    static HashSet<String> hashSet = new HashSet<>();

    public static void main(String[] args) {
        /**
         * HashSet 基于 HashMap 来实现的，是一个不允许有重复元素的集合。
         * HashSet 允许有 null 值。
         * HashSet 是无序的，即不会记录插入的顺序。
         * HashSet 不是线程安全的， 如果多个线程尝试同时修改 HashSet，则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。
         * HashSet 实现了 Set 接口。
         */

        // 增加元素，当元素中已经存在时直接覆盖
        hashSet.add("a");
        hashSet.add("b");
        // 移除元素，当元素不存在时不会移除
        hashSet.remove("1");

        // 判断集合中是否存在1
        System.out.println(hashSet.contains("1"));
        // 输出集合大小
        System.out.println(hashSet.size());
        // 判断集合是否为空
        System.out.println(hashSet.isEmpty());
        System.out.println(hashSet.toString());
        System.out.println(hashSet.clone());
        Object[] objects = hashSet.toArray();
        if (objects.length > 0){
            System.out.println("空的");
        }

        for (String str:hashSet) {
            System.out.println(str);
        }
        hashSet.forEach(System.out::println);
        // 清空集合
        hashSet.clear();

        //testHashSet();
    }

    public static void testHashSet(){
        /**
         * 多线程输出，得出结论线程不安全
         */
        new Thread(() ->{
            for (int i = 0 ; i < 1000;i++){
                hashSet.add(String.valueOf(i));
            }
        }).start();


        new Thread(() ->{
            for (int i = 1000 ; i < 2000;i++){
                hashSet.add(String.valueOf(i));
            }
        }).start();

        try {
            TimeUnit.MICROSECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(hashSet.size());
    }
}
